package com.pan.basic;

public class ClassDemo {

    InnerClass innerClass = new InnerClass();
    public void selfIntroduce(){
        System.out.println("hello,我是："+this.getClass().getName());
    }
    public void useInnerClass(){
        innerClass.selfIntroduce();

        InnerClass innerClass = new InnerClass();
        innerClass.name="wowo";
        innerClass.selfIntroduce();;
    }

    /**
     * 方法中的局部类
     */
    public void useMethodClass(){
        class MethodClass implements HelloInnerClass{

            @Override
            public void selfIntroduction() {
                System.out.println("我在方法里也可以创建哦，我的名字是:"+this.getClass().getName());
            }
        }
        MethodClass methodClass = new MethodClass();
        methodClass.selfIntroduction();
    }

    /**
     * 定义一个接口
     */
    interface HelloInnerClass{
        void selfIntroduction();
    };

    public static void main(String[] args) {
        SecondClass secondClass = new SecondClass();
        secondClass.selfIntroduce();
        //内部类不能new，会报错
        //InnerClass innerClass = new InnerClass();
        ClassDemo classDemo = new ClassDemo();
        classDemo.useInnerClass();
        //静态内部类，就可以在静态方法中直接new
        StaticInnerClass staticInnerClass = new StaticInnerClass();
        staticInnerClass.selfIntroduce();
        ClassDemo.StaticInnerClass staticInnerClass1 = new ClassDemo.StaticInnerClass();
        staticInnerClass1.selfIntroduce();
        StaticInnerClass.selfIntroduce("静态方法自我介绍。");

        //匿名内部类
        HelloInnerClass trump = new HelloInnerClass() {
            @Override
            public void selfIntroduction() {
                System.out.println("wowo,我是一个匿名内部类哦,我的名字叫川建国。");
            }
        };
        trump.selfIntroduction();

        //局部类
        classDemo.useMethodClass();
    }

    /**
     * 普通内部类
     */
    class InnerClass{
        public String name;
        public void selfIntroduce(){
            System.out.println("hello,InnerClass，我的名字是：" + this.getClass().getName()+",name:"+name);
        }
    }

    /**
     * 静态内部类
     */
    static class StaticInnerClass{
        public String name = "StaticInnerClass";
        public void selfIntroduce(){
            System.out.println("hello,StaticInnerClass，我的名字是：" + this.getClass().getName()+",name:"+name);
        }
        public static void selfIntroduce(String wowo){
            System.out.println("hello,StaticInnerClass，我的名字是："+wowo);
        }
    }

}

/**
 * 同一个类文件中的其他类
 * 使用起来和public类没什么区别
 * 编译完之后是一个单独的class文件，与ClassDemo只差一个public
 */
class SecondClass{

    public void selfIntroduce(){
        System.out.println("hello,我是"+this.getClass().getName());
    }

    public static void main(String[] args) {
        ClassDemo classDemo = new ClassDemo();
        classDemo.selfIntroduce();
    }

}